#include <QCoreApplication>
#include <QDebug>
#include <QRegularExpression>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRegExp reg("ab");    //匹配ab
    qDebug()<<"匹配字符本身:"
            <<reg.exactMatch("abc")     //精准匹配abc
            <<reg.exactMatch("ab")
            <<endl;

    QRegExp reg1("(\\d*\\D{2})");    //其中的（）仅作为组合字符串，无实质意义
    qDebug()<<"匹配数字："
             <<reg1.exactMatch("111cm")
            <<reg1.exactMatch("111m")
           <<reg1.exactMatch("11cm");

    QRegExp rx("*.txt");
    rx.setPatternSyntax(QRegExp::Wildcard);    //设置匹配语法支持通配符
    qDebug()<<"通配符匹配："
           <<rx.exactMatch("License.txt")        //true
           <<rx.exactMatch("Lincenxee.txt.bak")  //false
           <<endl;

    //匹配单词边界
    QRegExp reg2;
    reg2.setPattern("\\b(hello|Hello)\\b");       //匹配一个单词为hello或者Hello
    qDebug()<<"匹配多个单词"
           <<reg2.indexIn("helloEveryone!")       //-1  表示失败
          <<reg2.indexIn("hmm hello everyone!")   //4表示匹配位置
         <<reg2.indexIn("hi,Hello")              //3
          <<endl;

    //捕获匹配的文本
    //非捕获括号语法：由 "(?:" 开始， ")"结束
    QRegExp regHeight("(\\d+)(?:\\s*)(cm|inch)");
    int res=regHeight.indexIn("YaoMing 226 cm");
    if(res>-1)
    {
        qDebug()<<"文本捕获:"
               <<"cap(0):"<<regHeight.cap(0)     //返回完整捕获的文本
               <<"cap(1):"<<regHeight.cap(1)     //返回第一次捕获到的文本
               <<"cap(2):"<<regHeight.cap(2)     //返回第二次捕获到的文本
               <<endl;
    }


    //断言?!  不紧跟才匹配
    QRegExp reg3;
    reg3.setPattern("面(?!包)");
    QString str="面没了，吃面包也好，吃面食物也好。";
    qDebug()<<str<<endl;
    str.replace(reg3,"意大利");      //指定一个正则表达式进行替换
    qDebug()<<str<<endl;

    //Qt5引入新的类
    QRegularExpression regExp("hello");

    qDebug()<<"QRegularExpression 匹配字符"
           <<regExp.match("hello word！")
           <<endl;

    regExp.setPattern("[A-Z]{3,8}");      //设置匹配模式
    regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);     //设置大小匹配不敏感
    qDebug()<<"大小写不敏感匹配"
           <<regExp.match("hello");

    QRegularExpression reDate("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
    QRegularExpressionMatch match0=reDate.match("01/10/1949");
    if(match0.hasMatch())
    {
        QString strMatch=match0.captured(0);
        QString day=match0.captured(1);
        QString month=match0.captured(2);
        QString year=match0.captured(3);

        qDebug()<<"捕获文本："
               <<"strcMatch:"<<strMatch<<endl
               <<"day:"<<day<<endl
               <<"month:"<<month<<endl
               <<"year:"<<year<<endl;
    }


    QString sPattern;
    sPattern="^(Ian|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";
    QRegularExpression reDate1(sPattern);

    QString ss("Apr 01");
    QRegularExpressionMatch match2;
    match2=reDate1.match(ss,
                  0,   //偏移量为0
                  QRegularExpression::PartialPreferCompleteMatch    //部分匹配
                  );

    bool bHasMatched=match2.hasMatch();
    bool bPartial=match2.hasPartialMatch();
    qDebug()<<bHasMatched<<bPartial;














    return a.exec();
}
